package com.atguigu.lease.admin.controller.apartment;


import com.atguigu.lease.admin.service.LabelInfoService;
import com.atguigu.lease.common.result.Result;
import com.atguigu.lease.model.bean.LabelInfo;
import com.atguigu.lease.model.enums.ItemTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "标签管理模块")
@RestController
@RequestMapping("/admin/label")
public class LabelController {

    @Autowired
    LabelInfoService service;

    @GetMapping("/list")
    @Operation(summary = "1,查询所有标签")
    public Result<List<LabelInfo>> list(
            //Knife4j的API文档注解 ->@Parameter
            @Parameter(description = "类型:1-公寓,2-房屋", in = ParameterIn.QUERY, required = false)
            //接收的参数type -> @RequestParam接收
            @RequestParam(value = "type", required = false)
            //创建枚举类约束传入的值
            ItemTypeEnum type) {
        /*
        目的：创建一个用于动态构建SQL查询条件的对象

        LambdaQueryWrapper：
        这是一个泛型类(<LabelInfo>)，专门用于构建针对LabelInfo实体类（对应数据库表）的查询条件。

        Wrappers.lambdaQuery(LabelInfo.class)：
        这是一个静态工厂方法，用来创建一个LambdaQueryWrapper的实例并指定它操作的实体类是LabelInfo
        */
        LambdaQueryWrapper<LabelInfo> wrapper = Wrappers.lambdaQuery(LabelInfo.class);
        /*
        目的：动态地添加一个WHERE条件：
        如果type参数不为null，则查询type字段等于传入的type值的记录；
        如果type为null，则忽略这个条件（查询所有记录）。
        */
        wrapper.eq(type != null, LabelInfo::getType, type);
        //目的： 执行实际的数据库查询操作。
        List<LabelInfo> list = service.list(wrapper);
        return Result.ok(list);
    }

    @PostMapping("saveOrUpdate")
    @Operation(summary = "2,新增或更新标签")
    public Result saveOrUpdate(
            @Parameter(description = "标签信息表", required = true)
            @RequestBody LabelInfo labelInfo)
    {
        service.saveOrUpdate(labelInfo);
        return Result.ok();
    }

    //    /admin/label/deleteById?id=4
    @DeleteMapping("deleteById")
    @Operation(summary = "3,根据id删除标签")
    public Result saveOrUpdate(@Parameter(description = "主键值")
                               @RequestParam(value = "id", required = true) Long id)
    {
        return Result.ok(service.removeById(id));
    }
}
